import App from './App'
import shareMixin from './mixins/shareMixin'

// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
import { request, callFunction, initTokenRefresher } from './utils/request.js'
import { getToken, clearToken, syncTokenStorage } from './utils/tokenManager.js'

Vue.config.productionTip = false
App.mpType = 'app'

// 初始化token存储和刷新机制
syncTokenStorage();
initTokenRefresher();

// 为uniCloud.callFunction添加拦截器
uniCloud.addInterceptor('callFunction', {
  invoke(args) {
    // 此处可以对参数进行额外处理，但不必要，因为uni_id_token会自动注入
    return args
  },
  success(res) {
    // 处理token过期
    if (res.result && (res.result.code === 401 || (res.result.code === -1 && res.result.message && res.result.message.includes('token')))) {
      // 登录态失效，清除本地token
      clearToken()
      
      uni.showModal({
        content: '会话过期，请重新登录',
        showCancel: false,
        success() {
          uni.reLaunch({
            url: '/pages/login/login'
          })
        }
      })
    }
    return res
  },
  fail(err) {
    console.error('云函数调用失败:', err)
    return err
  },
  complete(res) {
    return res
  }
})

// 为uniCloud.importObject添加拦截器
const importObjectInterceptor = {
  invoke: async (options) => {
    console.log('importObject拦截器 - 调用云对象:', options.name);
    
    // 定义不需要在客户端验证token的云对象
    const publicObjects = [
      'uni-id-co'
    ];
    
    const isPublicObject = publicObjects.includes(options.name);
    
    if (!isPublicObject) {
      const token = uni.getStorageSync('uni_id_token');
      if (!token) {
        console.log('importObject拦截器 - 无有效token，跳转登录页');
        uni.reLaunch({
          url: '/pages/login/login'
        });
        return Promise.reject(new Error('用户未登录'))
      }
    }
    
    return options;
  }
}
uniCloud.addInterceptor('importObject', importObjectInterceptor)

// 挂载请求方法到全局
Vue.prototype.$request = request;
// Vue.prototype.$callFunction = callFunction;

// 添加全局导航守卫
const needLoginPages = [
  // 这些页面需要用户登录才能访问
  '/pages/study/rules',
  '/pages/study/videos',
  '/pages/exam/exam',
  '/pages/study/plan',
  '/pages/my/my',
  '/packageMy/my/credential-upload' // 添加证书上传页面路径
];

// 全局页面导航拦截器
Vue.prototype.$checkLoginBeforeNavigate = (url) => {
  // 检查是否是需要登录的页面
  if (needLoginPages.some(page => url.indexOf(page) === 0)) {
    // 检查用户是否已登录
    const userInfo = uni.getStorageSync('userInfo');
    if (!userInfo) {
      // 未登录，跳转到登录页，并携带来源页面信息
      const currentPage = url.split('?')[0]; // 移除参数
      uni.navigateTo({
        url: `/pages/login/login?from=${encodeURIComponent(currentPage)}`
      });
      return false;
    }
  }
  return true;
};

// 重写uni.navigateTo方法
const originalNavigateTo = uni.navigateTo;
uni.navigateTo = (options) => {
  const app = getApp();
  // 检查页面是否需要登录
  if (app.$vm.$checkLoginBeforeNavigate(options.url)) {
    originalNavigateTo(options);
  }
};

// 全局混入分享功能
Vue.mixin(shareMixin)

const app = new Vue({
  ...App
})
app.$mount()
// #endif

// #ifdef VUE3
import { createSSRApp } from 'vue'
import { request, callFunction, initTokenRefresher } from './utils/request.js'
import { getToken, clearToken, syncTokenStorage } from './utils/tokenManager.js'

// 初始化token存储和刷新机制
syncTokenStorage();
initTokenRefresher();

// 为uniCloud.callFunction添加拦截器（Vue3版本）
uniCloud.addInterceptor('callFunction', {
  invoke(args) {
    return args
  },
  success(res) {
    // 处理token过期
    if (res.result && (res.result.code === 401 || (res.result.code === -1 && res.result.message && res.result.message.includes('token')))) {
      // 登录态失效，清除本地token
      clearToken()
      
      uni.showModal({
        content: '会话过期，请重新登录',
        showCancel: false,
        success() {
          uni.reLaunch({
            url: '/pages/login/login'
          })
        }
      })
    }
    return res
  }
})

export function createApp() {
  const app = createSSRApp(App)
  
  // 挂载请求方法到全局
  app.config.globalProperties.$request = request;
  app.config.globalProperties.$callFunction = callFunction;
  
  // 全局混入分享功能
  app.config.globalProperties.mixin(shareMixin)
  
  return {
    app
  }
}
// #endif

// 全局混入$callFunction方法，用于统一处理云函数调用
Vue.mixin({
  methods: {
    $callFunction({ name, data, ignoreToken = false }) {
      return new Promise((resolve, reject) => {
        // 非登录请求需要检查token
        if (!ignoreToken) {
          const token = getToken(); // 使用tokenManager获取token
          if (!token) {
            uni.showToast({
              title: '请先登录',
              icon: 'none'
            });
            
            setTimeout(() => {
              uni.navigateTo({
                url: '/pages/login/login'
              });
            }, 1500);
            
            return reject(new Error('未登录'));
          }
          
          // 添加token到请求数据
          if (!data.token) {
            data.token = token;
          }
        }
        
        uniCloud.callFunction({
          name,
          data
        }).then(res => {
          // 处理token过期情况已由全局拦截器处理，这里只需要返回结果
          resolve(res.result);
        }).catch(err => {
          uni.showToast({
            title: '请求失败，请稍后重试',
            icon: 'none'
          });
          reject(err);
        });
      });
    }
  }
});

// 某个特定页面
export default {
  onShareAppMessage() {
    // 自定义分享内容，会覆盖 mixin 中的方法
    return {
      title: '自定义标题',
      path: '/pages/custom/page',
      imageUrl: '/static/custom-image.png'
    }
  }
}